# coding:utf-8
# Project:pyinterface
# author:wj
# time:2022/12/30 17:41
# Email:1305137785@qq.com
import re
import time
import json
import allure
from tool.handle_MD import HandleMD5Tool
from conf.settings import kfw_info
from tool.handle_attribute import HandleAttribute
from tool.handle_fasker import Handle_Faker
from loguru import logger
class HandleReplace:
    def __init__(self):
        self.faker = Handle_Faker()
        self.handle_md5 = HandleMD5Tool()
    # 根据替换数据的来源，获取数据，再设置为类属性(全局变量)  ["times","file_path","partyCode"]
    def get_data_and_set_attr(self,key):
        if key == "phone":
            print(f"需要替换key={key}")
            if hasattr(HandleAttribute,key):
                print('----占位操作---')
            else:
                mobile=self.faker.get_phone_number()
                setattr(HandleAttribute, key, str(mobile))
        elif key == "times":
            # 这里的times要覆盖掉，因为每次接口请求都是不一样的时间
            print(f"需要替换key={key}")
            times = int(time.time() * 1000)
            setattr(HandleAttribute, key, times)
        elif key == "user":
            setattr(HandleAttribute,key,kfw_info['user'])
        elif key == "passwd":
            setattr(HandleAttribute, key, self.handle_md5.Md5Tool(kfw_info['password']))
        else:
            print("暂不支持该类型参数替换")
    #参数替换
    @allure.step("请求参数替换")
    def replace_data(self, data: str):
        """
        思路：
        1、首先要知道需要替换那个参数
           通过正则表达式获取需要替换的参数的值
        2、用来替换参数的数据从哪里来的
           脚本生成、其他接口响应提取、数据库查询获取、写到配置文件
        3、如何替换参数
           字符串替换数据
        :return:
        """
        # data: str

        if data:
            # 拿到需要替换的key   ["times","file_path","partyCode"]
            key_list = re.findall(r"#(\w.+?)#", data)
            if len(key_list)>0:
                allure.attach(body=data, name='替换之前的参数', attachment_type=allure.attachment_type.TEXT)
                # 将需要替换的数据设置为类属性，用来替换
                for key in key_list:
                    # 获取数据并设置为类属性
                    self.get_data_and_set_attr(key=key)
                # 替换数据
                for key in key_list:
                    data = data.replace(f"#{key}#", str(getattr(HandleAttribute,key)))
                data = json.loads(data)
                print("转换数据：", type(data), data)
                allure.attach(body=json.dumps(data), name='参数替换后的参数',
                              attachment_type=allure.attachment_type.TEXT)
                return data
            else:
                allure.attach(body='不需要替换参数', name='不需要替换参数', attachment_type=allure.attachment_type.TEXT)
                print("不需要替换参数")
                data = json.loads(data)
                return data

        else:
            print("请求参数为空，不需要进行参数替换")
            return {}

    # 替换sql语句
    def replace_sql(self, expect_db: str):
        '''
        替换sql语句的思路：
        1、先确定sql语句那个数据要替换
        2、然后对于要替换的数据，做特殊标记
        3、利用正则表达式 找到要替换的数据，然后对不同的数据做不同的处理
        4、将要替换的数据设置为类属性作为全局变量
        5、利用字符串的replace函数来完成替换
        '''
        try:
            if expect_db:
                keylist = re.findall(r"#(\w.+?)#", expect_db)
                if len(keylist) > 0:
                    logger.info("--替换sql语句--")
                    for key in keylist:
                        expect_db = expect_db.replace(f"#{key}#", str(getattr(HandleAttribute, key)))
                    expect_db = json.loads(expect_db)
                    print('转换后数据是{}'.format(expect_db))
                    logger.info(f"--替换后的setup_sql:{expect_db},数据类型{type(expect_db)}--")
                    return expect_db
                else:
                    expect_db = json.loads(expect_db)
                    logger.info("没有sql需要转换{}'.format(expect_db)")
                    print('没有sql需要转换{}'.format(expect_db))
                    return expect_db
            else:
                print('测试用例里数据库断言为空，不需要数据库断言')
        except AssertionError as error:
            # 收集错误日志
            logger.exception(error)
            raise TypeError
